package modelo.moviles.naves;

import modelo.*;
import modelo.estrategias.*;
import modelo.moviles.exceptions.ArsenalSinArmas;
import modelo.moviles.balas.Bala;
import modelo.armas.*;
public class Algo42 extends NaveArmada {
	private int accion;
	
	
	public Algo42 (Nivel nuevoNivel){
		super (nuevoNivel);

		this.getNivel().setAlgo42(this);
		this.setColumna(this.getNivel().getCantColumnas() / 2);
		this.setFila(this.getNivel().getCantFilas());

		/* "El Algo42 va a empezar con un arma de tipo Laser" */
		this.setArsenal(new Arsenal());
		this.getArsenal().agregarArma(new Laser(nuevoNivel));
		this.getEnergia().incrementarPorcentaje(100);
	}

	/* "Al destuirse el Algo42 se pierde el nivel." */
	public void destruirse(){
		this.getNivel().perderNivel();
		this.estallar();
	}
	
	/* "Al disparar le pide a su arsenal que dispare y luego le cambia la estrategia" */
	public Bala disparar() throws ArsenalSinArmas{
		Bala bala ;
		
		try {
			bala =super.disparar();
		} catch (ArsenalSinArmas e){
			this.arsenal.agregarArma(new Laser(this.nivel));
			bala = this.arsenal.disparar();
		}
		
		bala.setFila(this.getFila() - 10);
		bala.setEstrategia(new EstrategiaBalaAlgo42());
		bala.setEnemiga(false);
		return bala;
	}


	/* "Le aviso al otro movil que se encontro con un Algo42 " */
	public void encuentroCon(Encontrable encontrable){
		encontrable.encuentroConAlgo42(this);
	}

	/* Manejo el encuentro con las balas */
	public void encuentroConBala (Encontrable encontrable){
		Bala unaBala = (Bala) encontrable;
		if (unaBala.esEnemiga()){
			unaBala.estallar();
			this.recibirBala(unaBala);
			if (this.debeDestruirse()){
				this.destruirse();
			}
		}
	}

	
	/* "La Nave maneja el encuentro con el Algo42 " */
	public void encuentroConNave( Encontrable nave){
		nave.encuentroConAlgo42(this);
	}
	
	
	
	public void setAccion(int accion){
		this.accion=accion;
	};
	
	
	

	/* "El Algo42 no tiene movimiento automatico. 
	 * Para eso esta moverAbajo moverArriba moverDerecha moverIzquierda"
	 */
	public void vivir() {
		switch (this.accion){
		case 2:
			if (this.getFila() > 1) {
				this.setFila(this.getFila() -10 );
			}
			break;
		case 1:
			if (this.getFila() < this.getNivel().getCantFilas()-1){
				this.setFila(this.getFila() + 10);
			}
			break;
		case 3:
			if (this.getColumna() > 1){
				this.setColumna(this.getColumna() - 10);
			}
			break;
		case 4:
			if (this.getColumna() < this.getNivel().getCantColumnas() - 1){
				this.setColumna(this.getColumna() + 10);
			}
			break;
		case 5:
			try {
				Bala bala = this.disparar();
			} catch (Exception e) {
				e.printStackTrace();
			}
			break;
			
		default:
			break;
		}
		this.setAccion(0);
	}
	
	/* Mueve al movil en base al sentido dado
	 * 1: Abajo
	 * 2: Arriba
	 * 3: Izquierda
	 * 4: Derecha
	 * */
	public void moverAlgo42 (int sentido){
		switch (sentido){
		case 1:
			if (this.getFila() > FACTOR_MOVIMIENTO) {
				this.setFila(this.getFila() - FACTOR_MOVIMIENTO );
			}
			break;
		case 2:
			if (this.getFila() < this.getNivel().getCantFilas()-FACTOR_MOVIMIENTO){
				this.setFila(this.getFila() + FACTOR_MOVIMIENTO);
			}
			break;
		case 3:
			if (this.getColumna() > FACTOR_MOVIMIENTO){
				this.setColumna(this.getColumna() - FACTOR_MOVIMIENTO);
			}
			break;
		case 4:
			if (this.getColumna() < this.getNivel().getCantColumnas() - FACTOR_MOVIMIENTO){
				this.setColumna(this.getColumna() + FACTOR_MOVIMIENTO);
			}
			break;
		default:
			break;
		}
	}


}
